'''
Created on 23/11/2012

@author: rcasal
'''
# -*- coding: utf-8 -*-

T.force('es-es')

if 0:
    None
    import gluon
    import gluon.languages.translator as T
    from gluon.html import A, DIV, TABLE, TR, TD, SELECT, OPTION, XML, URL, BUTTON
    global redirect; redirect = gluon.globals.redirect()
    global response; response = gluon.globals.Response()
    global request; request = gluon.globals.Request()
    global service; service = gluon.tools.Service()
    global crud; crud = gluon.tools.Crud()
    global local_import; local_import = gluon.compileapp.local_import_aux
    global session; session = gluon.globals.Session()
    from repositories.sigecon.comunicacion import ComunicacionRepository as comunicaciones
    from repositories.sigecon.comunicacion import ModalidadRepository as modalidades
    from repositories.sigecon.comunicacion import CondicionRepository as condiciones
    from repositories.sigecon.consulta import ConsultaRepository as consultas
    from repositories.sigecon.usuario import SectorRepository as sectores
    from repositories.sigecon.usuario import AuthRepository as auth
    from repositories.sigecon.consulta import TipoConsultaRepository as tipos
    from repositories.sigecon.consulta import SubtipoConsultaRepository as subtipos
    from repositories.sigecon.consulta import RespuestaRepository as respuestas
    from repositories.sigecon.mails import BandejaEntradaRepository as bandeja_mails    
    from repositories.sigecon.mails import MailConsultaRepository as mails_consulta    
    from repositories.sigecon.mails import MailRespuestaRepository as mails_respuesta   
    from repositories.comunes.domicilio import ProvinciaRepository as provincias
    from repositories.comunes.domicilio import LocalidadRepository as localidades
    from repositories.comunes.tipodocumento import TipoDocumentoRepository as tipos_doc
    from repositories.afiliaciones.afiliado import AfiliadoRepository as afiliados
    from repositories.afiliaciones.establecimiento import EstablecimientoCabeceraRepository as establecimientos
    

import json
import datetime
from dateutil import parser
from dateutil.parser import *
from domain.reports.reports import ReportConsultas


############################  REPORTS  ##########################

def reporte_consultas(queryset, title='Listado de Consultas'):
    from domain.reports.reports import ReportConsultas
    from geraldo.generators import PDFGenerator
    import gluon.contenttype
    import StringIO
    resp = StringIO.StringIO()
    report = ReportConsultas(queryset=queryset, title=title)
    report.generate_by(PDFGenerator, filename=resp)
    resp.seek(0)
    response.headers['Content-Type'] = gluon.contenttype.contenttype('.pdf')#'application/pdf'
    filename = "consultas_report.pdf"
    response.headers['Content-disposition'] = "attachment; filename=\"%s\"" % filename
    return resp.read()    
    
def recargar_con_url_informe():
    tipo = request.vars.cons
    if(tipo == 'hoy'):
        url_informe = str(URL('informes','consultas_report.pdf', vars = dict(cons = 'hoy')))
    elif(tipo == 'fechas'):
        fechaDesde = request.vars.desde
        fechaHasta = request.vars.hasta
        url_informe = str(URL('informes','consultas_report.pdf', vars = dict(cons = 'fechas', desde = fechaDesde, hasta = fechaHasta)))
    elif(tipo == 'nofin'):
        url_informe = str(URL('informes','consultas_report.pdf', vars = dict(cons = 'nofin')))
    elif(tipo == 'all'):
        url_informe = str(URL('informes','consultas_report.pdf', vars = dict(cons = 'all')))
    else:
        url_informe = str(URL('informes','consultas_report.pdf', vars = dict(cons = 'vacia')))
        
    url = str(URL('informes','inf_consultas', vars = dict(url = url_informe)))
    res = dict(url = url)
    return json.JSONEncoder().encode(res)

def consultas_report():
    tipo = request.vars.cons
    if(tipo == 'all'):
        title = 'Listado de Consultas'
        cons = consultas.findAll(asdict = True) 
    elif(tipo == 'hoy'):
        hoy = datetime.datetime.now()
        title = 'Listado de Consultas ' + hoy.strftime("%d/%m/%Y")
        cons = consultas.findByDate(datetime.datetime.now(), asdict = True) 
    elif(tipo == 'nofin'):
        title = 'Listado de Consultas sin finalizar' 
        cons = consultas.findByFinalizado(False, asdict = True)
    elif(tipo == 'vacia'):
        title = '...Sin consultas...'
        cons = consultas.findOne(0, asdict = True)
    elif(tipo == 'fechas'):
        fechaDesde = parser.parse(request.vars.desde, dayfirst = True)
        fechaHasta = parser.parse(request.vars.hasta, dayfirst = True)
        strTitulo = " desde " + (fechaDesde).strftime("%d/%m/%Y") + " hasta " + (fechaHasta).strftime("%d/%m/%Y")
        title = 'Listado de Consultas' + strTitulo 
        cons = consultas.findByDate(fechaDesde, fechaHasta, asdict = True) 
    else:
        title = '...Sin consultas...'
        cons = consultas.findOne(0, asdict = True)
    return reporte_consultas(cons, title)

######################### CHARTS #############################

def pie_comunicaciones_por_usuario():
    usuarios = auth.findAllUsers(asdict = True)
    r = []
    for usu in usuarios:
        com = comunicaciones.findAllByUserId(usu.id, asdict = True)
        cantidad = len(com)
        cantidad = 1
        r.append(dict(y = cantidad, text = usu.username, tooltip = str(cantidad) + " comunicaciones"))   
    res = json.JSONEncoder().encode(r)
    return res

def pie_comunicaciones_por_provincia():
    prov = provincias.findAll(asdict = True)
    r = []
    for p in prov:
        com = comunicaciones.findAllByProvincia(p.id, asdict = True)
        cantidad = len(com)
        r.append(dict(y = cantidad, text = p.Name, tooltip = str(cantidad) + " comunicaciones"))   
    res = json.JSONEncoder().encode(r)
    return res

def pie_consultas_resultado():
    cons_finalizadas = len(consultas.findByFinalizado(True, asdict = True))
    cons_nofinalizadas = len(consultas.findByFinalizado(False, asdict = True))
    r = []
    r.append(dict(y = cons_finalizadas, text = "finalizadas", tooltip = str(cons_finalizadas) + " consultas"))   
    r.append(dict(y = cons_nofinalizadas, text = "no finalizadas", tooltip = str(cons_nofinalizadas) + " consultas"))   
    res = json.JSONEncoder().encode(r)
    return res

def chart_consultas_por_dia():
    strdia = ""
    hoy = datetime.date.today()
    mes = hoy.month
    anio = hoy.year
    r = []
    for numdia in range(1,31):
        if numdia < 10:
            strdia = "0"
        strdia = strdia + str(numdia) + "/" + str(mes) + "/" + str(anio) 
        fechaDesde = parser.parse(strdia, dayfirst = True)
        fechaHasta = None
        cantidad = len(comunicaciones.findByDate(fechaDesde, fechaHasta, asdict = True))
        if  numdia% 2== 0:
            cantidad = numdia * 1.3
        else:
            cantidad = numdia * 2
        r.append(cantidad)
        strdia = ""
    res = json.JSONEncoder().encode(r)
    return res

def chart_comunicaciones_por_tipo_consultante():
    res = condiciones.findAll(asdict = True)
    r = []
    for condicion in res:
        com = comunicaciones.findAllByCondicion(condicion.id, asdict = True)
        cantidad = len(com)
        r.append([dict(y = cantidad, text = condicion.descripcion, tooltip = str(cantidad) + " comunicaciones")])   
    res = json.JSONEncoder().encode(r)
    return res
        
        
################################# CONTROLLERS ##########################
    
@auth.requires_login()  
@auth.requires_membership("INFORMES")    
def inf_consultas():
    if 'url' in request.vars:
        url = request.vars.url
    else:
        url = str(URL('informes','consultas_report.pdf', vars = dict(cons = 'vacia')))
    return dict(title = 'Listados de Consultas', url = url)

@auth.requires_login()  
@auth.requires_membership("INFORMES")    
def inf_graficos():
    return dict(title = 'Graficos')

@auth.requires_login()  
@auth.requires_membership("INFORMES")    
def inf_estadisticos():
    return dict(title = T('Estadisticas'))



